/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pio.action.administrador.inscripcion.utils;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.InputMismatchException;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;

/**
 *
 * @author linda
 */
public class MainCalculo {
        /** Se verifica que un entero no sea negativo
    * de ser asi se aborta el programa.
    * 
    */
    public static Integer getNote(HashMap rates,String key,int indice, int section ) {
        int z=0;
        Integer dig;
        System.out.println("");
        System.out.print("-"+key);
        ArrayList lin=(ArrayList)rates.get(key);
        Iterator itelin=lin.iterator();
         while(itelin.hasNext() ){
             ArrayList c=(ArrayList)itelin.next();
             Iterator qq=c.iterator();
             while(qq.hasNext()){
                dig=(Integer)qq.next();
                 System.out.print("*"+dig);
                 if(z==section) {
                     return (Integer)dig;
                 }
                 z++;
             }
             
         }
        return -1;
    }
   public static void calGlobalNotes(HashMap rates, Exam exam) {
    ArrayList rate=new ArrayList();
    
    int finalNotes=0,count=1;
    String ci;
    ArrayList lin;
    Iterator itelin;
     Iterator i=rates.keySet().iterator();
     while(i.hasNext()){
               ci=(String)i.next();
               System.out.print(count+".-"+ci);
               lin=(ArrayList)rates.get(ci);
               itelin=lin.iterator();
                while(itelin.hasNext()){
                    ArrayList c=(ArrayList)itelin.next();
                    Iterator qq=c.iterator();
                    while(qq.hasNext()){
                        Integer value=(Integer)qq.next();
                        System.out.print("  "+value);
                        rate.add(verify((Integer)value));    
                            //Verficar rate.
                        
                    }
                
                }
                  
     
     finalNotes=exam.calculateGlobalRate(rate," "+ci);      
     System.out.println("  "+finalNotes);
     count++;
     rate=new ArrayList();
           }
     
     
}
   public static void printRates(HashMap rates) {
     Iterator i=rates.keySet().iterator();
     while(i.hasNext()){
               
               ArrayList lin=(ArrayList)rates.get(i.next());
               Iterator itelin=lin.iterator();
                while(itelin.hasNext()){
                    ArrayList c=(ArrayList)itelin.next();
                    Iterator qq=c.iterator();
                    while(qq.hasNext()){
                        System.out.print("*"+qq.next());
                            //Verficar rate.
                    }
                
                }
           
           
           }
 
}
    public static int verify(int entero) {
        if(entero<0){
        System.out.println("No debe ingresar un numero negativo");
        System.exit(-1);
        }  
        return entero;
    }
    public static int loadExam(Exam exam) {
             
       int answers1=30,answers2=30,answers3=60;  //numero de preguntas por seccion
       int percent1=40,percent2=30,percent3=30;  //porcentajes asignados por seccion (pesos)
       int rate1=0,rate2=0,rate3=0; //notas 
       int error;
       String keyS;
       Section sec1,sec2,sec3;
       ArrayList listSec1,listSec2,listTests,l;
       Iterator iteKeys;
       Set setKeys;
       Test test1,test2; 
       Scanner in = new Scanner(System.in);
    //do{
    /*Peso Numero de preguntas*/
        
         //  System.out.println("Ingrese el numero de preguntas de Hab.Verbal");
            //answers1 = in.nextInt();
            //answers1=verify(answers1);
          // System.out.println("Ingrese el numero de preguntas de Hab.Num");
            //answers2 = in.nextInt();
            //answers2=verify(answers2);
            //System.out.println("Ingrese el numero de preguntas Raven");
           // answers3 = in.nextInt();
           // answers3=verify(answers3);
           
           listTests= (ArrayList)exam.getTests();
           
           
           
           /*Porcentaje para cada seccion*/
           //System.out.println("Ingrese el % de Hab.Verbal");
            //percent1 = in.nextInt();
            //percent1=verify(percent1);
            //sec1= new Section("Verbal",answers1,percent1);
            sec1= new Section("Matematica",50,20);
            sec1.verifyPer(exam.getOverallPercentage());
           //System.out.println("Ingrese el % de Hab.Num");
            //percent2 = in.nextInt();
            //percent2=verify(percent2);
            //sec2= new Section("Numerica",answers2,percent2);
            sec2= new Section("Verbal",50,50);
            sec2.verifyPer(exam.getOverallPercentage());
           // System.out.println("Ingrese el % de Raven");
           // percent3 = in.nextInt();
           // percent3=verify(percent3);
            //sec3= new Section("Raven",answers3,percent3);
            sec3= new Section("Raven",20,30);
            sec3.verifyPer(exam.getOverallPercentage());
            
            listSec1=new ArrayList();
            listSec2=new ArrayList();
            
            test1=new Test("Ver/Num",listSec1); 
            test2=new Test("Raven",listSec2);
            listSec1.add(sec1);
            listSec1.add(sec2);
            listSec2.add(sec3);
            listTests.add(test1);
            listTests.add(test2);
            
            /*Se verifican que los porcentajes sumen el overallpercent*/
            error = exam.verifyPercentsSections();
            if(error<0){
            System.out.println("Error: Los % de la secciones del Examen "
                    + "no suman ("+exam.getOverallPercentage()+")");
            System.exit(-1);
            
            }
            
            //System.out.println("Ingrese nota sobre "+answers1+" puntos");
            //rate1 = in.nextInt();  
          //} while(true);
    return 1;
}
    
    /** Se verifica que un entero no sea negativo
    * de ser asi se aborta el programa.
    * 
    */
    public static int loadFile(String pathfile, Key key,String tamKey,
            int tamIdperson,Boolean testKey,HashMap rates,ArrayList divitions) throws  IOException {
       String linea,idperson="",delims;
       String[] tokens;
       Object dups=null;
       BufferedReader brf;
       File archivo;
       FileReader fr;
       ArrayList calf,results=null; 
       Boolean s;
       int result,p=0,tamRate,w = 0;
        // Lectura del archivo       
       try{
        archivo = new File (pathfile);
        fr = new FileReader (archivo);
        brf = new BufferedReader(fr);
       }catch(FileNotFoundException ex){
            key.getErrs().add("Error: Verifique nombre de Archivo "+pathfile
                    + "No Encontrado");                              
            return -1;
       }
       
       while((linea=brf.readLine())!=null) {
          p++; //Pareceo Linea
          delims = "[\";,:\t\n\b\' ]+";
          tokens = linea.split(delims);
          s=false;
          result=-2;
          //Manipulacion de cedula y clave o cedula y nota
          for (int i = 0; i< tokens.length; i++) {
              //System.out.println(tokens.length);
            if (tokens[i].length()!=0){        
               if(tokens[i].length()==tamIdperson){
                   idperson=(String)tokens[i];
                   s=true;
               }else {
                  try {//con analisis de Clave    
                    if (testKey){    
                        tamRate=Integer.parseInt(tamKey);
                        if((tokens[i].length()==tamRate) || 
                            (tokens[i].length()!=tamRate && s==true)) {
                            //result=key.countSuccess(key,tokens[i],"En linea:"+p+"-"+idperson);
                            results=new ArrayList();
                            result=key.countSuccess2(key,tokens[i],divitions, results,"En linea:"+p+"-"+idperson);
                        }else{
                             key.getErrs().add("Error: En linea: "+p+" Verifique campo cedula");                 
                        }
                    }else{//sin analisis de Clave
                        
                         if((tokens[i].length()>0 && tokens[i].length()<=tamKey.length() &&
                                Integer.parseInt(tokens[i])<=Integer.parseInt(tamKey)) && s==true) {
                            result=Integer.parseInt(tokens[i]);
                            results=new ArrayList();
                            results.add(result);
                            
                        }else{
                             key.getErrs().add("Error: En linea: "+p+" Verifique campo cedula");                 
                        }
                    
                    }}catch(NumberFormatException ex){
                         
                         key.getErrs().add("Error: En linea: "+p+" Verifique-");                 
                    }
               }
            }
          }
           //Se llena la  hashtable con clave cedula y objeto notas.
          
          
           
          if (result<0 || idperson.equals("")){
                key.getErrs().add("Error: En linea: "+p+" Verifique");                 
          }
                //System.out.println(""+p+". "+idperson+" NOTA "+result);
                if(testKey){
                System.out.println(+p+"."+idperson+";"+results.toString());
                
                calf= new ArrayList();
                calf.add(results);
                        
                dups=rates.put(idperson,calf);
                if (dups!=null){
                    System.out.println("\tAdvertencia. Esta cédula "+idperson+" fue reemplazada por "
                    + "su ocurrencia en la línea "+p);
                }
                }else{
                ArrayList l = (ArrayList)rates.get(idperson);
                if(l==null){
                System.out.println("\nLa cedula "+idperson+" no se encuentra "
                        + "en la carga del primer archivo. En linea "+p+".");
                }else{
                    l.add(results);
                    rates.put(idperson,l);
                }
                }
          
       }  
        //System.out.println("***FIn*** Usuarios "+p);     
       //System.out.print((String)rates.toString());
       //System.out.println(ratesP.size());
       //System.out.println(ratesR.size());
       
       return p; 
       
    }
    
    
    /**Clase solo para pruebas
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException {
       BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
       ArrayList errKey;
       ArrayList errKey2;
       String pathfile;
       ArrayList divitions;
       HashMap rates;
       String clave="BBCBBCADDABBCBBCADDABBCBBCADDABCBCAACCBBECDCACAABDBBAEEADCB"
               + "DBBCBBCADDABCBCABCCBBECDCACAABDBBAEEADCBA";  
       Key keyP,keyR;   
       Integer numSections;
       Exam exam;
       Boolean cont;
       int n=-1;
       //Carga del examen revisar atributos seteados.
       exam=new Exam("Pruebas",new ArrayList());
       loadExam(exam);
       numSections=(Integer)exam.getTests().size();
         try { 
       do {
           cont=false;
           rates= new HashMap();
           divitions=null;
           /*Archivo txt con notas de todos los alumnos*/
           if(cont==false){
           System.out.println("Ingrese la dirección del Archivo Prueba Pio");
           pathfile = br.readLine();
           //Prueba de la forma  Cedula Clave ("ABCNDE") true
           //8 porque no esta separado por puntos 18915788
           errKey= (ArrayList)new ArrayList();       
           
           keyP= new Key("Pio",clave,"ABCDE","NM",1,0,errKey);      
           divitions=new ArrayList();
           divitions.add(new Integer(50));//0-50 Primera Seccion
           divitions.add(new Integer(100));//50 - 100 Segunda Seccion de Pio.
           System.out.println("********Cedula; [Matematica, Verbal]************");
           n=loadFile(pathfile,keyP,"100",8,true,rates,divitions);
           keyP.printlnErrs();
           System.out.println("-* Fin Archivo "+pathfile);
           if (n<0){continue;}
           System.out.println("-----Usuarios "+n+"-----");
           }
           System.out.println("Ingrese la dirección del Archivo Prueba Raven");
           pathfile = br.readLine();
           //Prueba de la forma Cedula Nota (98) false
           //10 porque esta separado por puntos 18.915.788
           //100 [0-100] posible calificacion 
           errKey2= (ArrayList)new ArrayList();
           keyR= new Key("Raven","","","",0,0,errKey2);     
           n=loadFile(pathfile,keyR,"100",8,false, rates,null);
           //System.out.println("-* Archivo "+pathfile);
           keyR.printlnErrs();
           //System.out.println("-* Fin Archivo "+pathfile);
           if (n<0){
                cont=true;
                continue; }
           //Calculo de nota del examen 
           System.out.println("Cedula Nootas NotaGlobal");
           
            calGlobalNotes(rates, exam);
          
           System.out.println("-----Usuarios "+n+"-----");
           
           
          } while(true);//while true para probar 
       }catch(InputMismatchException e){
             System.out.println("Excepcion:: No ingreso un tipo de dato valido");
             System.exit(-1);
       }  
    }
}



